<?php

# -- DÉBUT NOTE DE LICENCE -------------------------------------
#
# Ce fichier fait partie de Clicpage.
#
# Copyright (c) 2010 Francois (www.clicpage.net)
# Distribué selon les termes de la licence GPL version 2.0.
# Consultez le fichier LICENCE ou
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#
# -- FIN NOTE DE LICENCE ---------------------------------------

/**
@ingroup CP_THEMES
@nosubgrouping
@brief Balises de template

cpBalisesTemplate comprend toutes les méthodes nécessaires pour transformer
les balises de template par défaut de Clicpage en code PHP.

*/
class cpBalisesTemplate
{
	
	

	
	
	protected $core;
	protected $theme_identifiant;
	
	
	
	

	/// @name Initialisation
	//@{
	
	
	/**
	Initialise une instance de cpBalisesTemplate.
	
	@param	theme_identifant<b>string</b>	Indentifiant du thème
	@param	core		<b>cpCore</b>	Instance de cpCore
	*/
	public function __construct($theme_identifiant, $core)
	{
		$this->theme_identifiant = $theme_identifiant;
		$this->core =& $core;
	}
	//@}
	
	
	
	
	
	/// @name Appliquer
	//@{
	
	
	/**
	Applique les balises par défaut de Clicpage à une instance de
	template.
	
	@param	template	<b>template</b>	Instance de template
	*/
	public function appliquer($template)
	{
		
		# Thème
		$template->addValue('ThemeURL', array($this, 'ThemeURL'));
		
		# Site
		$template->addValue('SiteTitre', array($this, 'SiteTitre'));
		$template->addValue('SiteSousTitre', array($this, 'SiteSousTitre'));
		$template->addValue('SiteDescription', array($this, 'SiteDescription'));
		$template->addValue('SiteAuteur', array($this, 'SiteAuteur'));
		$template->addValue('SiteCopyright', array($this, 'SiteCopyright'));
		$template->addValue('SiteURL', array($this, 'SiteURL'));
		
		# Catégories
		$template->addValue('CategorieId', array($this, 'CategorieId'));
		$template->addValue('CategorieTitre', array($this, 'CategorieTitre'));
		
		# Pages
		$template->addBlock('Pages', array($this, 'Pages'));
		$template->addBlock('PageIf', array($this, 'PageIf'));
		$template->addValue('PageId', array($this, 'PageId'));
		$template->addValue('PageGenerateur', array($this, 'PageGenerateur'));
		$template->addValue('PageLangue', array($this, 'PageLangue'));
		$template->addValue('PageURL', array($this, 'PageURL'));
		$template->addValue('PageTitre', array($this, 'PageTitre'));
		$template->addValue('PageEntete', array($this, 'PageEntete'));
		$template->addValue('PageContenu', array($this, 'PageContenu'));
		$template->addValue('PageDateModification', array($this, 'PageDateModification'));
		$template->addValue('PageDateCreation', array($this, 'PageDateCreation'));
		$template->addValue('PageAuteurPseudo', array($this, 'PageAuteurPseudo'));
		$template->addValue('PageAuteurPrenom', array($this, 'PageAuteurPrenom'));
		$template->addValue('PageAuteurNom', array($this, 'PageAuteurNom'));
		$template->addValue('PageAuteurEmail', array($this, 'PageAuteurEmail'));
		$template->addValue('PageChemin', array($this, 'PageChemin'));
		
		$template->addValue('PageHead', array($this, 'PageHead'));
		
		# Tags
		$template->addBlock('PageTags', array($this, 'PageTags'));
		$template->addValue('TagTexte', array($this, 'TagTexte'));
		$template->addValue('TagURL', array($this, 'TagURL'));
		
		# Commentaires
		$template->addValue('FormulaireCommentaires', array($this, 'FormulaireCommentaires'));
		$template->addBlock('Commentaires', array($this, 'Commentaires'));
		$template->addValue('CommentaireId', array($this, 'CommentaireId'));
		$template->addValue('CommentaireAuteur', array($this, 'CommentaireAuteur'));
		$template->addValue('CommentaireAuteurEmail', array($this, 'CommentaireAuteurEmail'));
		$template->addValue('CommentaireTitre', array($this, 'CommentaireTitre'));
		$template->addValue('CommentaireContenu', array($this, 'CommentaireContenu'));
		$template->addValue('CommentaireDate', array($this, 'CommentaireDate'));
		
		# Gadgets
		$template->addBlock('Gadgets', array($this, 'Gadgets'));
		$template->addValue('GadgetTitre', array($this, 'GadgetTitre'));
		$template->addValue('GadgetContenu', array($this, 'GadgetContenu'));
		
		# l10n
		$template->addValue('lang',array($this,'l10n'));
		
		# Système
		$template->addValue('SysComportement',array($this,'SysComportement'));
		$template->addValue('SysPropulsePar',array($this,'SysPropulsePar'));
		
	}
	//@}
	
	
	
	

	/// @name Thème
	//@{
	
	
	public function ThemeURL($attr)
	{
		return CP_URL_THEMES.$this->theme_identifiant;
	}
	//@}
	




	/// @name Site
	//@{
	
	
	public function SiteTitre($attr)
	{
		$f = $this->getFiltres($attr);
		return '<?php echo '.sprintf($f,"\$_ctx->site->getPropriete('site_titre')").'; ?>';
	}
	
	
	public function SiteSousTitre($attr)
	{
		$f = $this->getFiltres($attr);
		return '<?php echo '.sprintf($f,"\$_ctx->site->getPropriete('site_soustitre')").'; ?>';
	}
	
	
	public function SiteDescription($attr)
	{
		$f = $this->getFiltres($attr);
		return '<?php echo '.sprintf($f,"\$_ctx->site->getPropriete('site_description')").'; ?>';
	}
	
	
	public function SiteAuteur($attr)
	{
		$f = $this->getFiltres($attr);
		return '<?php echo '.sprintf($f,"\$_ctx->site->getPropriete('site_auteur')").'; ?>';
	}
	
	
	public function SiteCopyright($attr)
	{
		$f = $this->getFiltres($attr);
		return '<?php echo '.sprintf($f,"\$_ctx->site->getPropriete('site_copyright')").'; ?>';
	}
	
	
	public function SiteURL($attr)
	{
		$f = $this->getFiltres($attr);
		return '<?php echo '.sprintf($f,"CP_URL_PUBLIQUE").'; ?>';
	}
	//@}
	
	
	
	
	
	/// @name Catégorie
	//@{
	
	
	public function CategorieId($attr)
	{
		return '<?php echo (integer) $_ctx->categorie->cat_id; ?>';
	}	
	
	
	public function CategorieTitre($attr)
	{
		$f = $this->getFiltres($attr);
		return '<?php echo '.sprintf($f,'$_ctx->categorie->cat_titre').'; ?>';
	}
	//@}





	/// @name Pages
	//@{
	
	
	public function Pages($attr, $content)
	{
		
		$p = "<?php \n".
			'if(!isset($numero_page)) { $numero_page = 1; }'."\n".
			'$params = array();'."\n";
		
		if(!empty($attr['quantite'])) {
			$p.= "\$params['limit'] = ".(integer) $attr['quantite'].";\n";
		}
		
		if($attr['categorie'] == 'self') {
			$p.= "\$params['cat_id'] = (integer) \$_ctx->page->cat_id;\n";
		}
		
		$p.="\$_ctx->page = \$_ctx->site->getPages(\$params, CP_GET_STATIC); \n";

		$p.=
			'while($_ctx->page->fetch())'."\n".
			"{\n".
			"?>\n".
				$content.
			"<?php ".
			"} \n".
			"\$_ctx->pop('page'); ?>\n";
		
		return $p;	
		
	}
	//@}
	
	
	
	
	
	/// @name Page
	//@{
	
	
	public function PageIf($attr, $content)
	{
		$if = array();
		
		$operateur = isset($attr['operateur']) ? $this->getOperateur($attr['operateur']) : '&&';
		
		if (isset($attr['commentaires_actifs'])) {
			$sign = (boolean) $attr['commentaires_actifs'] ? '' : '!';
			$if[] = $sign.'$_ctx->page->commentairesActifs()';
		}
		
		if (isset($attr['afficher_commentaires'])) {
			if((boolean) $attr['afficher_commentaires']) {
				$if[] = '( $_ctx->page->page_commentaires != CP_COMMENTAIRES_DESACTIVES && $_ctx->page->countCommentaires($_ctx->page->getContexteCommentaires()) != 0 )';
				
			} else {
				$if[] = '( $_ctx->page->page_commentaires == CP_COMMENTAIRES_DESACTIVES || $_ctx->page->countCommentaires($_ctx->page->getContexteCommentaires()) == 0 )';				
			}
		}
		
		if (isset($attr['affiche_meta'])) {
			if((boolean) $attr['affiche_meta']) {
				$if[] = '$_ctx->page->affiche_meta()';
			} else {
				$if[] = '!$_ctx->page->affiche_meta()';
			}
		}
		
		if (isset($attr['affiche_tags'])) {
			if((boolean) $attr['affiche_tags']) {
				$if[] = '($_ctx->page->affiche_tags() && $_ctx->page->hasTag())';
			} else {
				$if[] = '(!$_ctx->page->affiche_tags() || !$_ctx->page->hasTag())';
			}
		}
		
		if (isset($attr['entete'])) {
			if((boolean) $attr['entete']) {
				$if[] = '$_ctx->page->public_entete() != \'\'';
			} else {
				$if[] = '$_ctx->page->public_entete() == \'\'';
			}
		}
		
		if (!empty($if)) {
			return '<?php if('.implode(' '.$operator.' ',$if).') : ?>'.$content.'<?php endif; ?>';
		} else {
			return $content;
		}
	}
	
	
	public function PageId($attr)
	{
		return '<?php echo (integer) $_ctx->page->page_id; ?>';
	}
	
	
	public function PageGenerateur($attr)
	{
		return '<?php echo $_ctx->page->page_generateur; ?>';
	}
	
	
	public function PageLangue($attr)
	{
		if($attr['code'] == '1') {
			return '<?php echo $_ctx->page->page_langue; ?>';
		}
		
		$f = $this->getFiltres($attr);
		return '<?php
			$langue = $_ctx->core->getLangueDescription($_ctx->page->page_langue);
			echo '.sprintf($f,'$langue->langue_identifiant').';
		?>';
		
	}
	
	
	public function PageURL($attr)
	{
		$f = $this->getFiltres($attr);
		return '<?php echo '.sprintf($f,'$_ctx->page->public_url()').'; ?>';
	}
	
	
	public function PageTitre($attr)
	{
		$f = $this->getFiltres($attr);
		return '<?php echo '.sprintf($f,'$_ctx->page->public_titre()').'; ?>';
	}
	
	
	public function PageEntete($attr)
	{
		$f = $this->getFiltres($attr);
		return '<?php echo '.sprintf($f,'$_ctx->page->public_entete()').'; ?>';
	}
	
	
	public function PageContenu($attr)
	{
		$f = $this->getFiltres($attr);
		return '<?php echo '.sprintf($f,'$_ctx->page->public_contenu()').'; ?>';
	}
	
	
	public function PageDateModification($attr)
	{		
		$f = $this->getFiltres($attr);
		
		if($rfc822) {
			return '<?php echo '.sprintf($f,'dt::rfc822($_ctx->page->public_date_modification(),$_ctx->core->site->getPropriete(\'site_tz\'))').'; ?>';
		} elseif($iso8601) {
			return '<?php echo '.sprintf($f,'dt::iso8601($_ctx->page->public_date_modification(),$_ctx->core->site->getPropriete(\'site_tz\'))').'; ?>';
		} elseif(isset($attr['format']) && !empty($attr['format'])) {
			$format = addslashes($attr['format']);
			return '<?php echo '.sprintf($f, 'dt::dt2str("'.$attr['format'].'", $_ctx->page->public_date_modification())').'; ?>';
		}
		
		return "<?php echo ".sprintf($f, "cpDt::belleDate(array('formatDate' => __('%e %B %Y'), 'formatHeure' => __('%H:%M')), strtotime(\$_ctx->page->public_date_modification()))")."; ?>";
	
	}
	
	
	public function PageDateCreation($attr)
	{		
		$f = $this->getFiltres($attr);
		
		$iso8601 = !empty($attr['iso8601']);
		$rfc822 = !empty($attr['rfc822']);
		
		if($rfc822) {
			return '<?php echo '.sprintf($f,'dt::rfc822($_ctx->page->public_date_creation(),$_ctx->core->site->getPropriete(\'site_tz\'))').'; ?>';
		} elseif($iso8601) {
			return '<?php echo '.sprintf($f,'dt::iso8601($_ctx->page->public_date_creation(),$_ctx->core->site->getPropriete(\'site_tz\'))').'; ?>';
		} elseif(isset($attr['format']) && !empty($attr['format'])) {
			$format = addslashes($attr['format']);
			return '<?php '.
				'echo '.sprintf(
					$f,
					'dt::dt2str("'.$attr['format'].'", $_ctx->page->public_date_creation())'
				).'; ?>';
		}
		
		return "<?php echo ".sprintf($f, "cpDt::belleDate(array('formatDate' => __('%e %B %Y'), 'formatHeure' => __('%H:%M')), strtotime(\$_ctx->page->public_date_creation()))")."; ?>";
	
	}
	
	
	public function PageAuteurPseudo($attr)
	{
		$f = $this->getFiltres($attr);
		return '<?php echo '.sprintf($f,'$_ctx->page->public_auteur_pseudo()').'; ?>';
	}
	
	
	public function PageAuteurPrenom($attr)
	{
		$f = $this->getFiltres($attr);
		return '<?php echo '.sprintf($f,'$_ctx->page->public_auteur_prenom()').'; ?>';
	}
	
	
	public function PageAuteurNom($attr)
	{
		$f = $this->getFiltres($attr);
		return '<?php echo '.sprintf($f,'$_ctx->page->public_auteur_nom()').'; ?>';
	}
	
	
	public function PageAuteurEmail($attr)
	{
		$f = $this->getFiltres($attr);
		return '<?php echo '.sprintf($f,'$_ctx->page->public_auteur_email()').'; ?>';
	}
	
	
	public function PageHead($attr)
	{

		return
		'<?php
			
			$titre = $_ctx->page->isSiteHome() ?
				$_ctx->site->getPropriete("site_titre") :
				$_ctx->page->public_titre()." | ".$_ctx->site->getPropriete("site_titre");
				
			echo \'<meta http-equiv="content-type" content="text/html; charset=utf-8" />
	<title>\'.$titre.\'</title>\'."\n";

			if($_ctx->site->getPropriete(\'public_jquery\') == 1) {
				echo \'<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js" type="text/javascript"></script>\'."\n";
			}
			echo \'<script language="javascript" type="text/javascript">cpUrlPublique = "\'.CP_URL_PUBLIQUE.\'";</script>\';
			echo $_ctx->page->public_head()."\n";
			# --COMPORTEMENT-- publicHead
			echo $_ctx->core->executerComportement(\'publicHead\', $_ctx);
			
		?>';

	}
	
	
	public function PageChemin($attr)
	{
		
		$i = isset($attr['debut']) ? (integer) $attr['debut'] : 0;
		
		return 
		'<?php
		
		if($_ctx->page->pageSpeciale)
		{
			echo \'<a href="\'.CP_URL_PUBLIQUE_RELATIVE.\'">\'.html::escapeHTML($_ctx->core->site->getPropriete("site_titre"))."</a> > ".$_ctx->page->public_titre();
		}
		else
		{
		
			$arb = $_ctx->page->getArborescence();
			$c = count($arb);
			$c_h = $_ctx->page->isCatHome();
			if($c_h) { $c--; }
			$l = false;
			$liens = array();
			for($i='.$i.'; $i<$c; $i++)
			{
				$liens[] = \'<a href="\'.CP_URL_PUBLIQUE_RELATIVE.html::escapeHTML($arb[$i][2]).\'">\'.html::escapeHTML($arb[$i][1]).\'</a>\';
				$l = true;
			}
			echo implode(" > ", $liens);
			if($l) { echo " > "; }
			echo \'<span class="arb_fin">\'.html::escapeHTML($_ctx->page->page_titre).\'</span>\';

		}
		?>';
		
	}
	//@}
	
	
	
	
	
	/// @name Tags
	//@{
	
	
	public function PageTags($attr, $content)
	{
		
		$p = '<?php
		
		$_ctx->tag = $_ctx->page->getTags();
		
		if(!defined(\'PUBLIC_TAGS_URL\')) {
			$rs = $_ctx->site->getPages(array(\'page_generateur\' => \'tags\', \'page_statut\' => CP_STATUT_ONLINE, \'limit\' => 1), CP_GET_RS);
			define(\'PUBLIC_TAGS_URL\', CP_URL_PUBLIQUE_RELATIVE.($rs->isEmpty() ? \'tags\' : $rs->page_url));
			unset($rs);
		}
		
		if(!$_ctx->tag->isEmpty())
		{
			while($_ctx->tag->fetch())
			{	
				?>'.$content.'<?php
			}
		}
		
		?>';
		
		return $p;
		
	}
	
	
	public function TagTexte($attr, $content)
	{
		$f = $this->getFiltres($attr);
		return '<?php echo '.sprintf($f,'html::escapeHTML($_ctx->tag->tag_texte)').'; ?>';
	}
	
	
	public function TagURL($attr, $content)
	{
		return '<?php echo PUBLIC_TAGS_URL.\',\'.rawurlencode($_ctx->tag->tag_texte); ?>';
	}
	//@}

	
	
	
	
	/// @name Commentaires
	//@{
	
	
	public function FormulaireCommentaires($attr)
	{
		return '<?php echo $_ctx->page->formulaireCommentaires(); ?>';
	}
	
	
	public function Commentaires($attr, $content)
	{
		
		$params = array(
			'"commentaire_statut" => CP_COMMENTAIRE_APPROUVE',
			'"order" => "'.(!empty($attr['order']) ? $attr['order'] : 'commentaire_date DESC').'"'
		);
		
		$p = '<?php
		
		$params = array(
			'.implode(",\n", $params).'
		);		
		
		$_ctx->commentaire = $_ctx->page->getCommentaires($params, CP_GET_STATIC);
		
		if(!$_ctx->commentaire->isEmpty())
		{
			while($_ctx->commentaire->fetch())
			{
				?>'.$content.'<?php
			}	
		}
		
		$_ctx->pop("commentaire");
		
		?>';
		
		return $p;
	}
	
	
	public function CommentaireId($attr)
	{
		return '<?php echo (integer) $_ctx->commentaire->commentaire_id; s?>';
	}
	
	
	public function CommentaireAuteur($attr)
	{
		$f = $this->getFiltres($attr);
		return '<?php echo '.sprintf($f,'$_ctx->commentaire->commentaire_auteur').'; ?>';
	}
	
	
	public function CommentaireAuteurEmail($attr)
	{
		$f = $this->getFiltres($attr);
		return '<?php echo '.sprintf($f,'$_ctx->commentaire->commentaire_email').'; ?>';
	}
	
	
	public function CommentaireTitre($attr)
	{
		$f = $this->getFiltres($attr);
		return '<?php echo '.sprintf($f,'$_ctx->commentaire->commentaire_titre').'; ?>';
	}
	
	
	public function CommentaireContenu($attr)
	{
		$f = $this->getFiltres($attr);
		return '<?php echo '.sprintf($f,'$_ctx->commentaire->commentaire_contenu').'; ?>';
	}
	
	
	public function CommentaireDate($attr)
	{		
		$f = $this->getFiltres($attr);
		
		if($rfc822) {
			return '<?php echo '.sprintf($f,'dt::rfc822($_ctx->commentaire->commentaire_date,$_ctx->core->site->getPropriete(\'site_tz\'))').'; ?>';
		} elseif($iso8601) {
			return '<?php echo '.sprintf($f,'dt::iso8601($_ctx->commentaire->commentaire_date,$_ctx->core->site->getPropriete(\'site_tz\'))').'; ?>';
		} elseif(isset($attr['format']) && !empty($attr['format'])) {
			$format = addslashes($attr['format']);
			return '<?php echo '.sprintf($f, 'dt::dt2str("'.$attr['format'].'", $_ctx->commentaire->commentaire_date)').'; ?>';
		}
		
		return "<?php echo ".sprintf($f, "cpDt::belleDate(array('formatDate' => __('%e %B %Y'), 'formatHeure' => __('%H:%M')), strtotime(\$_ctx->commentaire->commentaire_date))")."; ?>";
	
	}
	
	
	
	
	/// @name Gadgets
	//@{
	
	
	public function Gadgets($attr, $content)
	{

		if(empty($attr['nom'])) {
			throw new cpErreur(__('Le thème doit spécifier le nom de la zone de gadgets à afficher.'), null, 651);
		}
		
		
		return
		'<?php
		
			$gadgets = $_ctx->site->getGadgets(array("theme_id" => "'.$this->theme_identifiant.'",
													 "zone_id" => "'.addslashes($attr['nom']).'"),
						CP_GET_STATIC);
			
			if(!$gadgets->isEmpty())
			{
				
				while($gadgets->fetch())
				{
				
					$_ctx->gadget = $gadgets;
				
					if($_ctx->gadget->verifierAffichage($_ctx))
					{
						?>'.$content.'<?php
					}
					
					$_ctx->pop("gadget");
				
				}
				
			}
			
		?>';
		
	}
	
	
	public function GadgetTitre($attr)
	{
		$f = $this->getFiltres($attr);
		return '<?php echo '.sprintf($f,'$_ctx->gadget->public_titre($_ctx)').'; ?>';
	}
	
	
	public function GadgetContenu($attr)
	{
		$f = $this->getFiltres($attr);
		return '<?php echo '.sprintf($f,'$_ctx->gadget->public_contenu($_ctx)').'; ?>';
	}
	//@}
	
	
	
	
	
	/// @name l10n
	//@{
	
	
	public function l10n($attr,$str_attr)
	{
		$str_attr = preg_replace('/\s+/x',' ',$str_attr);
		return "<?php echo __('".str_replace("'","\\'",$str_attr)."'); ?>";
	}
	//@}
	
	
	
	

	/// @name Système
	//@{
	
	
	public function SysComportement($attr,$str_attr)
	{
		if (!isset($attr['comportement'])) {
			return;
		}
		
		$c = addslashes($attr['comportement']);
		return
		'<?php if ($_ctx->core->comportementExiste(\''.$c.'\')) { '.
			'$_ctx->core->executerComportement(\''.$c.'\',$_ctx);'.
		'} ?>';
	}
	
	
	public function SysPropulsePar($attr,$str_attr)
	{
		return
		"<?php printf(__('Propulsé par %s'), '<a href=\"http://www.clicpage.net\">Clicpage</a>'); ?>";
	}
	//@}
	
	
	
	
	
	/// @name Filtres
	//@{
	
	
	public function getFiltres($attr)
	{
		
		$p[0] = '0';	# encode_xml
		$p[1] = '0';	# remove_html
		$p[2] = '0';	# cut_string
		$p[3] = '0';	# lower_case
		$p[4] = '0';	# upper_case
		
		$p[0] = (integer) (!empty($attr['encoder_xml']) || !empty($attr['encoder_html']));
		$p[1] = (integer) !empty($attr['supprimer_html']);
		
		if (!empty($attr['couper']) && (integer) $attr['couper'] > 0) {
			$p[2] = (integer) $attr['couper'];
		}
		
		$p[3] = (integer) !empty($attr['minuscules']);
		$p[4] = (integer) !empty($attr['majuscules']);
		
		return "cpContexte::global_filter(%s,".implode(",",$p).")";

	}
	
	
	protected function getOperateur($op)
	{
		switch (strtolower($op))
		{
			case 'or':
			case '||':
				return '||';
			case 'and':
			case '&&':
			default:
				return '&&';
		}
	}
	//@}
	
	
}

?>